package com.hy.z.utils;

import io.jsonwebtoken.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authc.AuthenticationException;

import javax.xml.bind.DatatypeConverter;
import java.util.Date;
import java.util.UUID;

@Slf4j
public class JWTUtil {
    // 私钥
    private static final String SECRET_KEY = "fhy123456";

    /**
     * 生成一个jwtToken
     *
     * @param subject 用户名
     * @param expire  有效时间
     * @return json web token
     */
    public static String generatorToken(String subject, Long expire) {
        JwtBuilder jwt = Jwts.builder();
        // 设置token的唯一标识
        jwt.setId(UUID.randomUUID().toString());
        // 设置token的主体
        jwt.setSubject(subject);
        // 签发者
        jwt.setIssuer("city");
        // 签发时间
        jwt.setIssuedAt(new Date());
        // 设置有效时间
        if (null != expire) {
            Date expiration = new Date(System.currentTimeMillis() + expire);
            jwt.setExpiration(expiration);
        }
        // 私钥
        byte[] secretKeyBytes = DatatypeConverter.parseBase64Binary(SECRET_KEY);
        // 签名
        jwt.signWith(SignatureAlgorithm.HS256, secretKeyBytes);
        return jwt.compact();
    }

    //解析token
    public static Claims analyzingToken(String token) {
        try {
            //解析token
            return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();
        } catch (ArrayStoreException e) {
            e.printStackTrace();
           log.error("token过期: " + e.getMessage());
            throw new AuthenticationException("您登录的时间已失效请重新登录!");
        } catch (SignatureException e) {
            log.error("token签名无效: " + e.getMessage());
            throw new AuthenticationException("token 签名无效");
        } catch (MalformedJwtException e) {
            log.error("token格式错误: " + e.getMessage());
            throw new AuthenticationException("token 格式错误");
        } catch (IllegalArgumentException e) {
            log.error("token令牌为空:" + e.getMessage());
            throw new AuthenticationException("用户未登陆!");
        }
    }
}